<!DOCTYPE html>
<html >
<head>

    <!--[if lt IE 9]>
        <style>body {display: none; background: none !important} </style>
        <meta http-equiv="Refresh" Content="0; url=//outdatedbrowser.com/" />
    <![endif]-->

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="format-detection" content="telephone=no" />
<meta name="author" content="潍夫子" />



<meta name="description" content="类扩展和分类的区别

类扩展没有名字,分类有名字
类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩展方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明


UIView的frame和bounds的区别

frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点.
bounds表示的是控件矩形框的位置和尺寸,是以自">
<meta property="og:type" content="article">
<meta property="og:title" content="iOS问题总结<二>">
<meta property="og:url" content="http://weifuzi.oschina.io/2017/02/06/interview/index.html">
<meta property="og:site_name" content="潍夫子的个人博客">
<meta property="og:description" content="类扩展和分类的区别

类扩展没有名字,分类有名字
类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩展方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明


UIView的frame和bounds的区别

frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点.
bounds表示的是控件矩形框的位置和尺寸,是以自">
<meta property="og:updated_time" content="2018-05-30T03:16:37.165Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="iOS问题总结<二>">
<meta name="twitter:description" content="类扩展和分类的区别

类扩展没有名字,分类有名字
类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩展方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明


UIView的frame和bounds的区别

frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点.
bounds表示的是控件矩形框的位置和尺寸,是以自">

<link rel="apple-touch-icon" href= "/apple-touch-icon.png">


    <link rel="alternate" href="/atom.xml" title="潍夫子的个人博客" type="application/atom+xml">



    <link rel="shortcut icon" href="/favicon.png">



    <link href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css" rel="stylesheet">



    <link href="//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.css" rel="stylesheet">



    <script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script>
    <link href="//cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-minimal.css" rel="stylesheet">


<link rel="stylesheet" href="/css/style.css">



<link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">


<title>iOS问题总结&lt;二&gt; | 潍夫子的个人博客</title>

<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

<script>
    var yiliaConfig = {
        fancybox: true,
        animate: true,
        isHome: false,
        isPost: true,
        isArchive: false,
        isTag: false,
        isCategory: false,
        fancybox_js: "//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.js",
        scrollreveal: "//cdn.bootcss.com/scrollReveal.js/3.1.4/scrollreveal.min.js",
        search: true
    }
</script>


    <script> yiliaConfig.jquery_ui = [false]; </script>



    <script> yiliaConfig.rootUrl = "\/";</script>






</head>
<body>
  <div id="container">
    <div class="left-col">
    <div class="overlay"></div>
<div class="intrude-less">
    <header id="header" class="inner">
        <a href="/" class="profilepic">
            <img src="/img/avatar.png" class="animated zoomIn">
        </a>
        <hgroup>
          <h1 class="header-author"><a href="/">潍夫子</a></h1>
        </hgroup>

        

        
            <form id="search-form">
            <input type="text" id="local-search-input" name="q" placeholder="search..." class="search form-control" autocomplete="off" autocorrect="off" searchonload="false" />
            <i class="fa fa-times" onclick="resetSearch()"></i>
            </form>
            <div id="local-search-result"></div>
            <p class='no-result'>No results found <i class='fa fa-spinner fa-pulse'></i></p>
        


        

        <div id="switch-area" class="switch-area">
            <div class="switch-wrap">
                <section class="switch-part switch-part1">
                    <nav class="header-menu">
                        <ul>
                        
                            <li><a href="/">主页</a></li>
                        
                            <li><a href="/archives/">所有文章</a></li>
                        
                            <li><a href="/tags/">标签云</a></li>
                        
                        </ul>
                    </nav>
                    <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" href="mailto:yuyekuangmo@qq.com" title="Email"></a>
                            
                        </ul>
                    </nav>
                </section>
                
                
                
                

                
                
                <section class="switch-part switch-part3">
                
                    <div id="js-aboutme">没事打酱油</div>
                </section>
                
            </div>
        </div>
    </header>                
</div>
    </div>
    <div class="mid-col">
      <nav id="mobile-nav">
      <div class="overlay">
          <div class="slider-trigger"></div>
          <h1 class="header-author js-mobile-header hide"><a href="/" title="回到主页">潍夫子</a></h1>
      </div>
    <div class="intrude-less">
        <header id="header" class="inner">
            <a href="/" class="profilepic">
                <img src="/img/avatar.png" class="animated zoomIn">
            </a>
            <hgroup>
              <h1 class="header-author"><a href="/" title="回到主页">潍夫子</a></h1>
            </hgroup>
            
            <nav class="header-menu">
                <ul>
                
                    <li><a href="/">主页</a></li>
                
                    <li><a href="/archives/">所有文章</a></li>
                
                    <li><a href="/tags/">标签云</a></li>
                
                <div class="clearfix"></div>
                </ul>
            </nav>
            <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" target="_blank" href="mailto:yuyekuangmo@qq.com" title="Email"></a>
                            
                        </ul>
            </nav>
        </header>                
    </div>
    <link class="menu-list" tags="Tags" friends="Friends" about="About Me"/>
</nav>
      <div class="body-wrap"><article id="post-interview" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2017/02/06/interview/" class="article-date">
      <time datetime="2017-02-06T06:48:44.000Z" itemprop="datePublished">2017-02-06</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      iOS问题总结&lt;二&gt;
    </h1>
  

      </header>
      
      <div class="article-info article-info-post">
        
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/术业专攻/">术业专攻</a>
    </div>


        
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/总结/">总结</a></li></ul>
    </div>

        <div class="clearfix"></div>
      </div>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <h3 id="类扩展和分类的区别"><a href="#类扩展和分类的区别" class="headerlink" title="类扩展和分类的区别"></a>类扩展和分类的区别</h3><blockquote>
<ul>
<li>类扩展没有名字,分类有名字</li>
<li>类扩展可以为某个类增加额外的属性、成员变量、方法声明;分类只能扩展方法,不能扩充成员变量,如果在分类中声明了一个属性,分类只会生成这个属性的get\set方法声明</li>
</ul>
</blockquote>
<h3 id="UIView的frame和bounds的区别"><a href="#UIView的frame和bounds的区别" class="headerlink" title="UIView的frame和bounds的区别"></a>UIView的frame和bounds的区别</h3><blockquote>
<ul>
<li>frame表示的是控件矩形框在父控件中的位置和尺寸,是以父控件的左上角为坐标原点.</li>
<li>bounds表示的是控件矩形框的位置和尺寸,是以自己的左上角为坐标原点.</li>
</ul>
</blockquote>
<h3 id="引用资源的时候每个选项的含义"><a href="#引用资源的时候每个选项的含义" class="headerlink" title="引用资源的时候每个选项的含义"></a>引用资源的时候每个选项的含义</h3><blockquote>
<ul>
<li>copy:勾选copy,会把资源拷贝一份到项目的文件夹中(建议勾选,因为这样修改项目中的资源不会影响源资源)</li>
<li>Added folder:如果勾选Create groups,只会会创建一个虚拟的文件夹,程序打包后,安装包中不存在这个文件夹;如果勾选Create folder references,真的创建一个文件夹,程序打包后,安装包中真的有这个文件夹.</li>
<li>Add to targets:要不要把资源打包到软件安装包中去.一定要勾选,不勾选到时候程序打包后,安装包中没有这个资源.</li>
</ul>
</blockquote>
<h3 id="iOS中imageNamed和imageWithContentOfFile的区别"><a href="#iOS中imageNamed和imageWithContentOfFile的区别" class="headerlink" title="iOS中imageNamed和imageWithContentOfFile的区别"></a>iOS中imageNamed和imageWithContentOfFile的区别</h3><p><strong>Images.xcassets中的图片资源只能通过imageNamed:方法加载</strong></p>
<blockquote>
<ul>
<li>imageNamed：返回的对象会保存在缓存中，只有退出程序才会释放内存，但下一次调用很快，直接从缓存中读取即可。</li>
<li>imageWithContentOfFile：返回的对象不会保存在缓存中，一旦对象销毁就会释放内存。</li>
<li>结论: 如果图片较小，并且频繁使用的图片，使用imageName:来加载图片(按钮图片/主页图片/占位图)；如果图片较大，并且使用次数较少，使用imageWithContentOfFile:来加载(相册/版本新特性)。</li>
</ul>
</blockquote>
<h3 id="instancetype和id的区别"><a href="#instancetype和id的区别" class="headerlink" title="instancetype和id的区别"></a>instancetype和id的区别</h3><p>两个都可以代表任意类型，但是instancetype只能作为返回值使用且会类型检测，id可以作为返回值、参数也可以定义变量，不会进行类型检测</p>
<h3 id="通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame-方法中做吗"><a href="#通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame-方法中做吗" class="headerlink" title="通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame:方法中做吗?"></a>通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame:方法中做吗?</h3><p>如果是通过xib或者storyboard创建控件，初始化时是不会调用initWithFrame,会调用initWithCoder.初始化完毕会调用awakeFromNib方法,建议在awakeFromNib中做初始化</p>
<h3 id="计算一段文字的宽度和高度"><a href="#计算一段文字的宽度和高度" class="headerlink" title="计算一段文字的宽度和高度"></a>计算一段文字的宽度和高度</h3><blockquote>
<ul>
<li>如果文字只有一行,通过sizeWithAttributes:这个方法,告知这段文字的字体和字体大小就可以计算这段文字的尺寸.</li>
<li>如果文字需要换行计算高度,通过boundingRectWithSize: options: attributes:attributes context: 这个方法,告知这段文字的字体和字体大小,并且在一个限制的尺寸内计算这段文字的尺寸.</li>
</ul>
<p><code>两者都是NSString类的方法，Swift中需要将String转化为NSString后调用</code></p>
</blockquote>
<h3 id="makeKeyAndVisible做了哪些事情"><a href="#makeKeyAndVisible做了哪些事情" class="headerlink" title="makeKeyAndVisible做了哪些事情"></a>makeKeyAndVisible做了哪些事情</h3><blockquote>
<ul>
<li>让窗口成为显示状态.</li>
<li>把根控制器的View添加到窗口上面.</li>
<li>把当前窗口设置成应用程序的主窗口.</li>
</ul>
</blockquote>
<h3 id="程序启动流程"><a href="#程序启动流程" class="headerlink" title="程序启动流程"></a>程序启动流程</h3><p>一个程序从main函数开始启动</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">int main(int argc, char * argv[]) &#123;</div><div class="line">    @autoreleasepool &#123;</div><div class="line">        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>可以看到main函数会调用UIApplicationMain函数，它的四个参数的意思是：</p>
<blockquote>
<ul>
<li>argc: 代表程序在进入main函数时的参数的个数。默认为1。</li>
<li>argv: 代表包含的各个参数。默认为程序的名字。</li>
<li>principalClassName: UIApplication或者它的子类的名字, 如果传入的是nil, 则表示UIApplication的名字, 即@”UIApplication”。</li>
<li>delegateClassName: UIApplication的代理的名字。</li>
</ul>
</blockquote>
<p>在UIApplicationMain函数中，根据传入的UIApplication名称和它的代理的名称，会主要做下面的事情：</p>
<blockquote>
<ol>
<li>根据传入的名称创建UIApplication对象。</li>
<li>根据传入的代理名称创建UIApplication代理对象。</li>
<li>开启事件循环（如果不进行循环，那么在main函数结束后程序就结束了。要保证程序创建后可以一直存在）。</li>
<li>解析Info.plist文件：会在Info.plist文件里查找Main storyboard file base name这个Key对应的Value是否有值。如果有值，则表示之后会通过Storyboard加载控制器，AppDelegate会接收到didFinishLaunchingWithOptions消息（程序启动完成的时候），此时Storyboard会进行一系列的加载操作；如果没有值，则不会通过Storyboard加载控制器，接着AppDelegate会接收到didFinishLaunchingWithOptions消息（程序启动完成的时候），在这个时候需要我们通过代码的方式加载控制器。</li>
</ol>
</blockquote>
<p>通过代码的方式，需要我们在didFinishLaunchingWithOptions方法中进行加载控制器的相关操作:（通过Storyboard也会执行类似的操作）</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions &#123;</div><div class="line">    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];</div><div class="line">    UIViewController *viewController = [[UIViewController alloc] init];</div><div class="line">    self.window.rootViewController = viewController;</div><div class="line">    // 此时根控制器的view还没有加到self.window上</div><div class="line">    [self.window makeKeyAndVisible];</div><div class="line">    //修改self.window的hidden为NO，将根控制器的view加到self.window上</div><div class="line">    return YES;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="控制器中LoadView-的作用以及使用LoadView的注意点"><a href="#控制器中LoadView-的作用以及使用LoadView的注意点" class="headerlink" title="控制器中LoadView()的作用以及使用LoadView的注意点"></a>控制器中LoadView()的作用以及使用LoadView的注意点</h3><p>控制器调用LoadView：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">if 控制器是从StoryBoard中加载的 &#123;</div><div class="line"> 	从StoryBoard当中加载控制器的View</div><div class="line">&#125;else if 控制器是从Xib中加载的 &#123;</div><div class="line"> 	从xib加载控制器的View</div><div class="line">&#125;else &#123;</div><div class="line"> 	创建一个空的UIView设为当前控制器的View</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p><strong>注意：</strong></p>
<blockquote>
<ul>
<li>一旦重写了loadView,表示需要自己创建控制器的View.</li>
<li>如果控制器的View还没有赋值,就不能调用控制器View的get方法.会造成死循环.因为控制器View的get方法底层会调用loadView方法.</li>
</ul>
</blockquote>
<h3 id="KVC的底层实现逻辑"><a href="#KVC的底层实现逻辑" class="headerlink" title="KVC的底层实现逻辑"></a>KVC的底层实现逻辑</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[flagItem setValue:obj forKeyPath:key];</div></pre></td></tr></table></figure>
<p>拿字符串与当前类的属性进行匹配.如果匹配到,就给该属性赋值. </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">if 有跟key值相同名称的set方法 &#123;</div><div class="line">	调用set方法,把obj传入</div><div class="line">&#125;else if 存在相同名称,并且带有下划线的成员属性 &#123;</div><div class="line">	给该属性赋值</div><div class="line">&#125;else if 存在跟它相同名称的成员属性 &#123;</div><div class="line">	给该属性赋值</div><div class="line">&#125;else &#123;</div><div class="line">if 实现了 setValue:(id)value forUndefinedKey: &#123;</div><div class="line">		调用</div><div class="line">	&#125;else &#123;</div><div class="line">		报错</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="多线程技术的优缺点"><a href="#多线程技术的优缺点" class="headerlink" title="多线程技术的优缺点"></a>多线程技术的优缺点</h3><ul>
<li>优点：能够提高程序的执行效率和资源（CPU、内存等）的利用率</li>
<li>缺点：<ol>
<li>程序代码更加复杂、增加调试难度</li>
<li>创建线程会有额外开销，如果大量开启线程反而会降低程序的性能</li>
</ol>
</li>
</ul>
<h3 id="线程和进程是什么？它们之间有什么关系？"><a href="#线程和进程是什么？它们之间有什么关系？" class="headerlink" title="线程和进程是什么？它们之间有什么关系？"></a>线程和进程是什么？它们之间有什么关系？</h3><ul>
<li>进程是CPU调度和分配资源的单位；线程是CPU可识别的最小执行和调度单位。</li>
<li>关系：<ol>
<li>进程包含线程，同一个进程内的线程共享进程的资源</li>
<li>一个程序可以对应多个进程，一个进程中可以有多个线程，但每个进程至少要有一个线程；</li>
</ol>
</li>
</ul>
<h3 id="图片二级缓存的实现思路"><a href="#图片二级缓存的实现思路" class="headerlink" title="图片二级缓存的实现思路"></a>图片二级缓存的实现思路</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">if 存在内存缓存 &#123;</div><div class="line">	直接使用</div><div class="line">&#125;else &#123;</div><div class="line">	if 存在磁盘缓存 &#123;</div><div class="line">		保存一份到内存缓存</div><div class="line">		使用</div><div class="line">	&#125;else &#123;</div><div class="line">		下载图片</div><div class="line">		保存一份到内存缓存</div><div class="line">		保存一份到磁盘缓存</div><div class="line">		使用</div><div class="line">	&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="相对于GCD而言，操作队列-NSOperation和NSOperationQueue-的优势"><a href="#相对于GCD而言，操作队列-NSOperation和NSOperationQueue-的优势" class="headerlink" title="相对于GCD而言，操作队列(NSOperation和NSOperationQueue)的优势"></a>相对于GCD而言，操作队列(NSOperation和NSOperationQueue)的优势</h3><p><strong>GCD是纯C语言的API,而操作队列则是Object-C的对象。</strong>如果只是想简单开一个子线程执行任务推荐使用GCD，如果有很多任务需要开多个子线程下载推荐使用操作队列。</p>
<p><strong>优势：</strong></p>
<blockquote>
<ol>
<li>NSOperationQueue可以方便的调用cancel方法来取消某个操作，而GCD中的任务是无法被取消的（安排好任务之后就不管了）。</li>
<li>NSOperation可以方便的指定操作间的依赖关系。</li>
<li>NSOperation可以通过KVO提供对NSOperation对象的精细控制（如监听当前操作是否被取消或是否已经完成等）。</li>
<li>NSOperation可以方便的指定操作优先级。操作优先级表示此操作与队列中其它操作之间的优先关系，优先级高的操作先执行，优先级低的后执行。</li>
<li>通过自定义NSOperation的子类可以实现操作重用。</li>
</ol>
</blockquote>
<h3 id="手势及事件的传递机理"><a href="#手势及事件的传递机理" class="headerlink" title="手势及事件的传递机理"></a>手势及事件的传递机理</h3><blockquote>
<ol>
<li><p>确定事件所在的View：当用户触摸时，UIKit先创建一个事件对象，加到事件队列中，然后UIApplication从中取出来，然后来确定事件所在的View。</p>
<blockquote>
<p>首先让window调用<code>hitTest:withEvent:</code>方法，它会遍历自身的subView，如果view的userInteractionEnabled为NO或者view是隐藏的或者view的alpha小于0.01时，返回空指针，否则调用<code>hitTest:withEvent:</code>来判断事件是否发生在自己的区域内，如果返回true则调用自身(subView)的<code>hitTest:withEvent:</code>。如此循环直到找到最顶端的View。</p>
</blockquote>
</li>
<li><p>根据获得的最顶端的View通过nextResponder得到响应链：UIViewB —&gt; superViewA —&gt; UIViewControlA —&gt; rootView —&gt; rootViewController —&gt; window —&gt; UIApplication —&gt; AppDelegate</p>
</li>
<li>传递手势：<blockquote>
<ol>
<li>每次传递其中有一个，它会从事件链的最前面开始传递，先将event传递给事件链顶部的View的手势们。然后看有没有识别的，如果没有就继续到下一个响应者的手势们，如果识别，那么就停止传递。如果传递了整个链，还没有发现有识别的，事件会回到链的最前端，然后开始找第一个实现touch（touchbegin，touchend，等等）的view进行识别，然后停止本次传递。</li>
<li>从事件中再取出一个，继续进行一过程。最终到没有事件为止。</li>
</ol>
</blockquote>
</li>
</ol>
</blockquote>
<h3 id="include与-import的区别、-import与-class的区别"><a href="#include与-import的区别、-import与-class的区别" class="headerlink" title="#include与#import的区别、#import与@class的区别"></a>#include与#import的区别、#import与@class的区别</h3><ul>
<li>面向对象#include与#import效果相同，只是后者不会引起交叉编译，确保头文件只会被导入一次</li>
<li>import会包含类的所有信息，包括实体变量和方法，而@class只是告诉编译器，其后面声明的名称是类的名称，至于这些类是如何定义的，暂时不用考虑。</li>
</ul>
<h3 id="内存中堆区和栈区的区别"><a href="#内存中堆区和栈区的区别" class="headerlink" title="内存中堆区和栈区的区别"></a>内存中堆区和栈区的区别</h3><p>堆区一般由程序员分配和释放，若程序员不释放，则内存溢出；栈区由编译器自动分配释放，存放方法的参数值，局部变量的值等。</p>
<h3 id="ViewController各方法的调用时机"><a href="#ViewController各方法的调用时机" class="headerlink" title="ViewController各方法的调用时机"></a>ViewController各方法的调用时机</h3><ul>
<li>loadView：当控制器的根视图view为空，且此view被访问时调用</li>
<li>viewDidLoad：loadView调用之后调用</li>
<li>viewWillAppear：当控制器根视图被添加到父视图上时调用</li>
<li>viewDidUnload：iOS6之前，当内存警告时，先卸载试图，再调用viewDidUnload来释放内存</li>
</ul>
<h3 id="理解delegate"><a href="#理解delegate" class="headerlink" title="理解delegate"></a>理解delegate</h3><p>delegate又称为委托或代理，它是一种设计模式。delegate主要用于两个对象之间的通信交互，并且解除两个通信对象的耦合性，iOS中大量使用了delegate设计，主要用于视图与使用对象之间的通信交互。</p>
<h3 id="栈结构和队列的区别"><a href="#栈结构和队列的区别" class="headerlink" title="栈结构和队列的区别"></a>栈结构和队列的区别</h3><p>栈是限定只能在表的一端进行插入和删除操作的线性表（先进后出）；队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表（先进先出）。队列遍历数据的速度要快得多。</p>
<h3 id="TCP与UDP的区别"><a href="#TCP与UDP的区别" class="headerlink" title="TCP与UDP的区别"></a>TCP与UDP的区别</h3><ul>
<li>TCP全称为传输控制协议，是面向连接的、可靠、有序、无界、速度慢、开销大、有拥塞控制的协议；</li>
<li>UDP全称为用户数据报协议，是无连接的、不可靠、无序、有界、速度快、开销小、无拥塞控制的协议。</li>
</ul>
<h3 id="TCP连接的三次握手"><a href="#TCP连接的三次握手" class="headerlink" title="TCP连接的三次握手"></a>TCP连接的三次握手</h3><blockquote>
<ol>
<li>客户端发送syn包（syn=j）到服务器，并进入SYN_SEND状态，等待服务器确认；</li>
<li>服务器收到syn包，必须确认客户的SYN（syn=j+1），同时自己也发送一个syn包（syn=k），即SYN+ACK包，此时服务器进入SYN_RECV状态；</li>
<li>客户端收到服务器的SYN+ACK包，向服务器发送确认包ACK（ack=k+1），此包发送完毕，客户端和服务器端进入ESTABLISHED状态，完成三次握手。</li>
</ol>
</blockquote>
<h3 id="socket建立网络连接的步骤"><a href="#socket建立网络连接的步骤" class="headerlink" title="socket建立网络连接的步骤"></a>socket建立网络连接的步骤</h3><p>建立socket连接至少需要一对套接字，其中一个运行于客户端（ClientSocket），另一个运行于服务器端（ServerSocket）。连接过程：</p>
<blockquote>
<ol>
<li>服务器监听：服务器套接字并不定位具体的客户端套接字，而是处于等待连接的状态，实时监控网络状态，等待客户端的连接请求；</li>
<li>客户端请求：客户端的套接字提出连接请求，要连接的目标是服务器端的套接字。（客户端的套接字必须首先描述它要连接的服务器的套接字，指出服务器端套接字的地址和端口号，然后向服务器端套接字提出连接请求）</li>
<li>连接确认：当服务器端套接字监听到或者说接收到客户端套接字的连接请求时，就响应客户端套接字的请求，建立一个新的线程，把服务器端套接字的描述发给客户端，一旦客户端确认了此描述，双方就正式建立连接。</li>
</ol>
</blockquote>
<h3 id="优化UITableView的滑动速度"><a href="#优化UITableView的滑动速度" class="headerlink" title="优化UITableView的滑动速度"></a>优化UITableView的滑动速度</h3><ul>
<li>复用单元格，文字、图片直接用drawInRect绘制；</li>
<li>使用不透明的视图，单元格中尽量少使用动画；</li>
<li>滑动时不加载图片，停止滑动开始加载。图片加载使用异步加载，并且限制图片加载的并发数；</li>
<li>cell高度固定的话直接用cell.rowHeight设置高度，如果cell是动态行高，计算出高度后缓存。</li>
</ul>
<h3 id="对Runloop的理解"><a href="#对Runloop的理解" class="headerlink" title="对Runloop的理解"></a>对Runloop的理解</h3><p>一个runloop就是一个事件处理的循环，用来不停的调度工作以及处理输入事件，使用runloop的目的是让线程在有工作的时候忙于工作，而没工作的时候处于休眠状态。</p>
<h3 id="如何调用drawRect方法与layoutSubView方法，以及它们的作用"><a href="#如何调用drawRect方法与layoutSubView方法，以及它们的作用" class="headerlink" title="如何调用drawRect方法与layoutSubView方法，以及它们的作用"></a>如何调用drawRect方法与layoutSubView方法，以及它们的作用</h3><ul>
<li>通过setNeedsDisplay方法调用drawRect方法来绘图；</li>
<li>通过setNeedsLayout方法异步调用layoutSubView方法来布局子视图。</li>
</ul>
<h3 id="OC的理解与特性"><a href="#OC的理解与特性" class="headerlink" title="OC的理解与特性"></a>OC的理解与特性</h3><ul>
<li>OC作为一门面向对象的语言，自然具有面向对象的语言特性：封装、继承、多态。它既具有静态语言的特性（如C++），又有动态语言的效率（动态绑定、动态加载等）。</li>
<li>Objective-C具有相当多的动态特性，表现为三方面：动态类型（Dynamic typing）、动态绑定（Dynamic binding）和动态加载（Dynamic loading）。所谓动态即必须到运行时（run time）才会做的一些事情。<ul>
<li>动态类型：即运行时再决定对象的类型，这种动态特性在日常的应用中非常常见，简单来说就是id类型。事实上，由于静态类型的固定性和可预知性，从而使用的更加广泛。静态类型是强类型，而动态类型属于弱类型，运行时决定接受者。</li>
<li>动态绑定：基于动态类型，在某个实例对象被确定后，其类型便被确定了，该对象对应的属性和响应消息也被完全确定。</li>
<li>动态加载：根据需求加载所需要的资源，最基本就是不同机型的适配，例如，在Retina设备上加载@2x的图片，而在老一些的普通苹设备上加载原图，让程序在运行时添加代码模块以及其他资源，用户可根据需要加载一些可执行代码和资源，而不是在启动时就加载所有组件，可执行代码可以含有和程序运行时整合的新类。</li>
</ul>
</li>
</ul>
<h3 id="简述内存管理"><a href="#简述内存管理" class="headerlink" title="简述内存管理"></a>简述内存管理</h3><ul>
<li>之前：OC内存管理遵循<strong>“谁创建，谁释放，谁引用，谁管理”</strong>的机制，当创建或引用一个对象的时候，需要向她发送alloc、copy、retain消息，当释放该对象时需要发送release消息，当对象引用计数为0时，系统将释放该对象，这是OC的手动管理机制（MRC）。</li>
<li>目前：iOS 5.0之后引用自动管理机制——自动引用计数（ARC），管理机制与手动机制一样，只是不再需要调用retain、release、autorelease；它编译时的特性，当你使用ARC时，在适当位置插入release和autorelease；它引用strong和weak关键字，strong修饰的指针变量指向对象时，当指针指向新值或者指针不复存在，相关联的对象就会自动释放，而weak修饰的指针变量指向对象，当对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。</li>
</ul>
<blockquote>
<p><em>理解：</em></p>
<ul>
<li>如果使用alloc、copy(mutableCopy)或者retian一个对象时,你就有义务,向它发送一条release或者autorelease消息。其他方法创建的对象,不需要由你来管理内存。</li>
<li>向一个对象发送一条autorelease消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象。</li>
<li>向一个对象发送release消息,并不意味着这个对象被销毁了,而是当这个对象的引用计数为0时,系统才会调用dealloc方法,释放该对象和对象本身它所拥有的实例。</li>
</ul>
</blockquote>
<p><em>在ARC下的工程采用非ARC去编译某些类：选中你所要操作的Target，选Build Phases，在其中Complie Sources中选择需要MRC的文件双击，并在输入框中输入<code>-fno-fobjc-arc</code></em></p>
<h3 id="isMemberOfClass和isKindOfClass联系与区别"><a href="#isMemberOfClass和isKindOfClass联系与区别" class="headerlink" title="isMemberOfClass和isKindOfClass联系与区别"></a>isMemberOfClass和isKindOfClass联系与区别</h3><ul>
<li>联系：两者都能检测一个对象是否是某个类的成员</li>
<li>区别：isKindOfClass不仅用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否派生自该类的成员 ,而isMemberOfClass只能做到第一点。</li>
</ul>
<h3 id="assign、strong、copy的用法与区别"><a href="#assign、strong、copy的用法与区别" class="headerlink" title="assign、strong、copy的用法与区别"></a>assign、strong、copy的用法与区别</h3><ul>
<li>assign:普通赋值,一般常用于基本数据类型,常见委托设计模式, 以此来防止循环引用。(我们称之为弱引用).</li>
<li>strong:保留计数,获得到了对象的所有权,引用计数在原有基础上加1.</li>
<li>copy:一般认为,是在内存中重新开辟了一个新的内存空间,用来存储新的对象,和原来的对象是两个不同的地址,引用计数分别为1。但是当copy对象为不可变对象时,那么copy的作用相当于retain。因为,这样可以节约内存空间</li>
</ul>
<h3 id="沙盒的理解"><a href="#沙盒的理解" class="headerlink" title="沙盒的理解"></a>沙盒的理解</h3><p>每个iOS应用都被限制在“沙盒”中，沙盒相当于一个加了仅主人可见权限的文件夹，即在应用程序安装过程中，系统为每个单独的应用程序生成它的主目录和一些关键的子目录。</p>
<blockquote>
<ol>
<li>AppName.app 目录：这是应用程序的程序包目录，包含应用程序的本身。由于应用程序必须经过签名，所以您在运行时不能对这个目录中的内容进行修改，否则可能会使应用程序无法启动。</li>
<li>Documents 目录：您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。</li>
<li><p>Library 目录：这个目录下有两个子目录：</p>
<blockquote>
<ul>
<li>Preferences 目录：包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件，而是应该使用NSUserDefaults类来取得和设置应用程序的偏好.</li>
<li>Caches 目录：用于存放应用程序专用的支持文件，保存应用程序再次启动过程中需要的信息。</li>
</ul>
<p>可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹，除Caches以外，都会被iTunes备份。</p>
</blockquote>
</li>
<li><p>tmp 目录：这个目录用于存放临时文件，保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。</p>
</li>
</ol>
</blockquote>

      
    </div>
    
  </div>
  
    
    <div class="copyright">
        <p><span>Title:</span><a href="/2017/02/06/interview/">iOS问题总结&lt;二&gt;</a></p>
        <p><span>Author:</span><a href="/" title="Back to Homepage">潍夫子</a></p>
        <p><span>Created:</span>2017-02-06, 14:48:44</p>
        <p><span>Updated:</span>2018-05-30, 11:16:37</p>
        <p>
            <span>Full URL:</span><a class="post-url" href="/2017/02/06/interview/" title="iOS问题总结&lt;二&gt;">http://weifuzi.oschina.io/2017/02/06/interview/</a>
            <span class="copy-path" data-clipboard-text="From http://weifuzi.oschina.io/2017/02/06/interview/　　By 潍夫子" title="Copy Article&#39;s Link &amp; Author"><i class="fa fa-clipboard"></i></span>
            <script> var clipboard = new Clipboard('.copy-path'); </script>
        </p>
        <p>
            <span>License:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" title="CC BY-NC-SA 4.0 International" target = "_blank">"CC BY-NC-SA 4.0"</a> Keep Link &amp; Author if Distribute.
        </p>
    </div>



    <nav id="article-nav">
        
            <div id="article-nav-newer" class="article-nav-title">
                <a href="/2017/02/08/iOS-summary/">
                    iOS知识总结&lt;一&gt;
                </a>
            </div>
        
        
            <div id="article-nav-older" class="article-nav-title">
                <a href="/2017/02/05/creatMyBlog/">
                    免费个人博客搭建（Hexo+osChina）
                </a>
            </div>
        
    </nav>

  
</article>

    <div id="toc" class="toc-article">
        <strong class="toc-title">Contents</strong>
        
            <ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#类扩展和分类的区别"><span class="toc-number">1.</span> <span class="toc-text">类扩展和分类的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#UIView的frame和bounds的区别"><span class="toc-number">2.</span> <span class="toc-text">UIView的frame和bounds的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#引用资源的时候每个选项的含义"><span class="toc-number">3.</span> <span class="toc-text">引用资源的时候每个选项的含义</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#iOS中imageNamed和imageWithContentOfFile的区别"><span class="toc-number">4.</span> <span class="toc-text">iOS中imageNamed和imageWithContentOfFile的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#instancetype和id的区别"><span class="toc-number">5.</span> <span class="toc-text">instancetype和id的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame-方法中做吗"><span class="toc-number">6.</span> <span class="toc-text">通过xib或者storyboard创建控件，初始化的操作可以在initWithFrame:方法中做吗?</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#计算一段文字的宽度和高度"><span class="toc-number">7.</span> <span class="toc-text">计算一段文字的宽度和高度</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#makeKeyAndVisible做了哪些事情"><span class="toc-number">8.</span> <span class="toc-text">makeKeyAndVisible做了哪些事情</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#程序启动流程"><span class="toc-number">9.</span> <span class="toc-text">程序启动流程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#控制器中LoadView-的作用以及使用LoadView的注意点"><span class="toc-number">10.</span> <span class="toc-text">控制器中LoadView()的作用以及使用LoadView的注意点</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#KVC的底层实现逻辑"><span class="toc-number">11.</span> <span class="toc-text">KVC的底层实现逻辑</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#多线程技术的优缺点"><span class="toc-number">12.</span> <span class="toc-text">多线程技术的优缺点</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#线程和进程是什么？它们之间有什么关系？"><span class="toc-number">13.</span> <span class="toc-text">线程和进程是什么？它们之间有什么关系？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#图片二级缓存的实现思路"><span class="toc-number">14.</span> <span class="toc-text">图片二级缓存的实现思路</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#相对于GCD而言，操作队列-NSOperation和NSOperationQueue-的优势"><span class="toc-number">15.</span> <span class="toc-text">相对于GCD而言，操作队列(NSOperation和NSOperationQueue)的优势</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#手势及事件的传递机理"><span class="toc-number">16.</span> <span class="toc-text">手势及事件的传递机理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#include与-import的区别、-import与-class的区别"><span class="toc-number">17.</span> <span class="toc-text">#include与#import的区别、#import与@class的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#内存中堆区和栈区的区别"><span class="toc-number">18.</span> <span class="toc-text">内存中堆区和栈区的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#ViewController各方法的调用时机"><span class="toc-number">19.</span> <span class="toc-text">ViewController各方法的调用时机</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#理解delegate"><span class="toc-number">20.</span> <span class="toc-text">理解delegate</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#栈结构和队列的区别"><span class="toc-number">21.</span> <span class="toc-text">栈结构和队列的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#TCP与UDP的区别"><span class="toc-number">22.</span> <span class="toc-text">TCP与UDP的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#TCP连接的三次握手"><span class="toc-number">23.</span> <span class="toc-text">TCP连接的三次握手</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#socket建立网络连接的步骤"><span class="toc-number">24.</span> <span class="toc-text">socket建立网络连接的步骤</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#优化UITableView的滑动速度"><span class="toc-number">25.</span> <span class="toc-text">优化UITableView的滑动速度</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#对Runloop的理解"><span class="toc-number">26.</span> <span class="toc-text">对Runloop的理解</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#如何调用drawRect方法与layoutSubView方法，以及它们的作用"><span class="toc-number">27.</span> <span class="toc-text">如何调用drawRect方法与layoutSubView方法，以及它们的作用</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#OC的理解与特性"><span class="toc-number">28.</span> <span class="toc-text">OC的理解与特性</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#简述内存管理"><span class="toc-number">29.</span> <span class="toc-text">简述内存管理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#isMemberOfClass和isKindOfClass联系与区别"><span class="toc-number">30.</span> <span class="toc-text">isMemberOfClass和isKindOfClass联系与区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#assign、strong、copy的用法与区别"><span class="toc-number">31.</span> <span class="toc-text">assign、strong、copy的用法与区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#沙盒的理解"><span class="toc-number">32.</span> <span class="toc-text">沙盒的理解</span></a></li></ol>
        
    </div>
    <style>
        .left-col .switch-btn,
        .left-col .switch-area {
            display: none;
        }
        .toc-level-3 i,
        .toc-level-3 ol {
            display: none !important;
        }
    </style>

    <input type="button" id="tocButton" value="Hide"  title="Show or Hide Table of Contents">

    <script>
        yiliaConfig.toc = ["Hide", "Show", !!"false"];
    </script>



    
<div class="share">
    
        <div class="bdsharebuttonbox">
            <a href="#" class="fa fa-twitter bds_twi" data-cmd="twi" title="分享到推特"></a>
            <a href="#" class="fa fa-weibo bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
            <a href="#" class="fa fa-qq bds_sqq" data-cmd="sqq" title="分享给 QQ 好友"></a>
            <a href="#" class="fa fa-files-o bds_copy" data-cmd="copy" title="复制网址"></a>
            <a href="#" class="fa fa fa-envelope-o bds_mail" data-cmd="mail" title="通过邮件分享"></a>
            <a href="#" class="fa fa-weixin bds_weixin" data-cmd="weixin" title="生成文章二维码"></a>
            <a href="#" class="fa fa-share-alt bds_more" data-cmd="more"></i></a>
        </div>
        <script>
            window._bd_share_config={
                "common":{"bdSnsKey":{},"bdText":"iOS问题总结<二>　| 潍夫子的个人博客　","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
        </script>
    

    
</div>







    




    <div class="scroll" id="post-nav-button">
        
            <a href="/2017/02/08/iOS-summary/" title="Pre: iOS知识总结&lt;一&gt;">
                <i class="fa fa-angle-left"></i>
            </a>
        

        <a title="Mini Archives"><i class="fa fa-bars"></i><i class="fa fa-times"></i></a>

        
            <a href="/2017/02/05/creatMyBlog/" title="Next: 免费个人博客搭建（Hexo+osChina）">
                <i class="fa fa-angle-right"></i>
            </a>
        
    </div>

    <ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/2019/04/02/buyHouse/">置业储备</a></li><li class="post-list-item"><a class="post-list-link" href="/2019/03/28/CSS初探/">CSS初探</a></li><li class="post-list-item"><a class="post-list-link" href="/2019/03/28/html标签初探/">html标签初探</a></li><li class="post-list-item"><a class="post-list-link" href="/2018/05/30/iOS11Safearea/">iOS11 SafeArea适配相关</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/03/28/Efficiency-XcodeTemplate/">高效工作--自定义Xcode类模板</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/02/08/iOS-summary/">iOS知识总结<一></a></li><li class="post-list-item"><a class="post-list-link" href="/2017/02/06/interview/">iOS问题总结<二></a></li><li class="post-list-item"><a class="post-list-link" href="/2017/02/05/creatMyBlog/">免费个人博客搭建（Hexo+osChina）</a></li></ul>




    <script>
        
    </script>
</div>
      <footer id="footer">
    <div class="outer">
        <div id="footer-info">
            <div class="footer-left">
                <i class="fa fa-copyright"></i> 
                2017-2019 潍夫子
            </div>
            <div class="footer-right">
                <a href="http://hexo.io/" target="_blank" title="A fast, simple &amp; powerful blog framework">Hexo</a>  Theme <a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" title="Another simple and elegant theme for Hexo  v3.5">Yelee</a> by MOxFIVE <i class="fa fa-heart animated infinite pulse"></i>
            </div>
        </div>
        
            <div class="visit">
                
                    <span id="busuanzi_container_site_pv" style='display:none'>
                        <span id="site-visit" title="Site Visitors"><i class="fa fa-user" aria-hidden="true"></i><span id="busuanzi_value_site_uv"></span>
                        </span>
                    </span>
                
                
                    <span>| </span>
                
                
                    <span id="busuanzi_container_page_pv" style='display:none'>
                        <span id="page-visit"  title="Page Hits"><i class="fa fa-eye animated infinite pulse" aria-hidden="true"></i><span id="busuanzi_value_page_pv"></span>
                        </span>
                    </span>
                
            </div>
        
    </div>
</footer>
    </div>
    
<script data-main="/js/main.js" src="//cdn.bootcss.com/require.js/2.2.0/require.min.js"></script>

    <script>
        $(document).ready(function() {
            var iPad = window.navigator.userAgent.indexOf('iPad');
            if (iPad > -1 || $(".left-col").css("display") === "none") {
                var bgColorList = ["#9db3f4", "#414141", "#e5a859", "#f5dfc6", "#c084a0", "#847e72", "#cd8390", "#996731"];
                var bgColor = Math.ceil(Math.random() * (bgColorList.length - 1));
                $("body").css({"background-color": bgColorList[bgColor], "background-size": "cover"});
            }
            else {
                var backgroundnum = 5;
                var backgroundimg = "url(/background/bg-x.jpg)".replace(/x/gi, Math.ceil(Math.random() * backgroundnum));
                $("body").css({"background": backgroundimg, "background-attachment": "fixed", "background-size": "cover"});
            }
        })
    </script>





<div class="scroll" id="scroll">
    <a href="#" title="Back to Top"><i class="fa fa-arrow-up"></i></a>
    <a href="#comments" onclick="load$hide();" title="Comments"><i class="fa fa-comments-o"></i></a>
    <a href="#footer" title="Go to Bottom"><i class="fa fa-arrow-down"></i></a>
</div>
<script>
    // Open in New Window
    
        var oOpenInNew = {
            
            
            
            
            
            
             archives: ".archive-article-title", 
             miniArchives: "a.post-list-link", 
            
             friends: "#js-friends a", 
             socail: ".social a" 
        }
        for (var x in oOpenInNew) {
            $(oOpenInNew[x]).attr("target", "_blank");
        }
    
</script>

<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
  </div>
</body>
</html>